public class queue8 {
    int max = 8;//最多有8个皇后
    static int count = 0;//记录有多少种方法
    int[] array = new int[max];//使用一维数组来保存每个皇后的位置
    public static void main(String[] args) {
        queue8 q = new queue8();//新建类对象来调用我们的回溯方法
        q.check(0);
        System.out.println(count);
    }

    private void print(){//循环输出结果
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
        count++;//执行一次我加一次
    }
    private void check(int n){
        if (n==max){//如果n等于8了,其实我已经下到第9个皇后了,因为数组下标是7
            print();
        }else {//如果没有下完,启动递归回溯
            for (int i = 0; i < max; i++) {
                array[n] = i;//让数组里先等于i,如果这个i不能下再加加,也就是回溯到这里继续查
                if (where(n)){//看看哪里可以下
                    check(n+1);//如果可以下,那就接着下棋
                }
            }
        }
    }
    private boolean where(int n){
        for (int i = 0; i < n; i++) {//循环n边,现在是第几个皇后就循环几遍
            //array[i] == array[n] 是判断在不在同一列
            //Math.abs(n-i) == Math.abs(array[n]-array[i]) 判断n-i永远是1 因为是下一个皇后,n-i如果是1
            //为1代表一定是在左上边或者右上边,比如,n是[3][0] i是[4][0+1]或者i[2][0+1]所以要n-i来判断是不是1;
            //这里有可能是负数所以要加绝对值方法.
            if (array[i] == array[n]||Math.abs(n-i) == Math.abs(array[n]-array[i])){//
                return false;
            }
        }
        return true;
    }
}
